if (typeof(JS_LIB_LOADED) == 'boolean') {
  var JS_RDFBASE_LOADED = true;
  var JS_RDFBASE_FILE = "rdfBase.js";

  var JS_RDFBASE_CONTAINER_PROGID = '@mozilla.org/rdf/container;1';
  var JS_RDFBASE_CONTAINER_UTILS_PROGID = '@mozilla.org/rdf/container-utils;1';
  var JS_RDFBASE_LOCATOR_PROGID = '@mozilla.org/filelocator;1';
  var JS_RDFBASE_RDF_PROGID = '@mozilla.org/rdf/rdf-service;1';
  var JS_RDFBASE_RDF_DS_PROGID = '@mozilla.org/rdf/datasource;1?name=xml-datasource';

  /***************************************
   * RDFBase is the base class for all RDF classes
   *
   */
  function RDFBase(aDatasource) {
    this.RDF = Components.classes[JS_RDFBASE_RDF_PROGID].getService();
    this.RDF = this.RDF.QueryInterface(Components.interfaces.nsIRDFService);
    this.RDFC = Components.classes[JS_RDFBASE_CONTAINER_PROGID].getService();
    this.RDFC = this.RDFC.QueryInterface(Components.interfaces.nsIRDFContainer);
    this.RDFCUtils = Components.classes[JS_RDFBASE_CONTAINER_UTILS_PROGID].getService();
    this.RDFCUtils = this.RDFCUtils.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
    if (aDatasource) {
      this._base_init(aDatasource);
    }
  }

  RDFBase.prototype = {
    RDF: null,
    RDFC: null,
    RDFCUtils: null,
    dsource: null,
    valid: false,

    _base_init: function(aDatasource) {
      this.dsource = aDatasource;
    },

    getDatasource: function() {
      return this.dsource;
    },

    isValid: function() {
      return this.valid;
    },

    setValid: function(aTruth) {
      if (typeof(aTruth) == 'boolean') {
        this.valid = aTruth;
        return this.valid;
      } else {
        return null;
      }
    },

    flush: function() {
      if (this.isValid()) {
        this.dsource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
      }
    }

  };

  RDFBase.prototype.getAnonymousResource = function() {
    jslibDebug("entering getAnonymousNode");
    if (this.isValid()) {
      var res = this.RDF.GetAnonymousResource();
      return new RDFResource("node", res.Value, null, this.dsource);
    } else {
      jslibError(null, "RDF is no longer valid!\n", "NS_ERROR_UNEXPECTED",
        JS_RDF_FILE + ":getNode");
      return null;
    }
  };

  RDFBase.prototype.getAnonymousContainer = function(aType) {
    jslibDebug("entering getAnonymousContainer");
    if (this.isValid()) {
      var res = this.getAnonymousResource();
      jslibDebug("making Container");
      if (aType == "bag") {
        this.RDFCUtils.MakeBag(this.dsource, res.getResource());
      } else if (aType == "alt") {
        this.RDFCUtils.MakeAlt(this.dsource, res.getResource());
      } else {
        this.RDFCUtils.MakeSeq(this.dsource, res.getResource());
      }
      jslibPrint("* made cont ..." + res.getSubject() + "\n");
      return new RDFContainer(aType, res.getSubject(), null, this.dsource);
    } else {
      jslibError(null, "RDF is no longer valid!\n", "NS_ERROR_UNEXPECTED",
        JS_RDF_FILE + ":getNode");
      return null;
    }
  };

  jslibDebug('*** load: ' + JS_RDFBASE_FILE + ' OK');

} // END BLOCK JS_LIB_LOADED CHECK
else {
  jslibPrint("JS_RDFBase library not loaded:\n" +
    " \tTo load use: chrome://jslib/content/jslib.js\n" +
    " \tThen: include('chrome://jslib/content/rdf/rdf.js');\n\n");
}
